<? 
/** Класс Db  - библиотека методов для простой работы с базой данных через статические методы.  

	Методы:
	
	Db::get_results($sql, $arg1, $arg2, ...) - извлекает выборку-таблицу, - индексный массив из объектов
		Параметры:
		$sql - (обязательно) SQL-запрос. Может содержать символы автоподстановки. # - заменяется на префикс таблицы, ? - заменяется на один из последующих аргументов ($arg1, $arg2,...), который подгатавливается для вставки в SLQL запрос
		
		$arg1, $arg2,... - (необязатеьно) значения, которые нужно подготовить и подставаить в SQL запрос вместо символа "?". 
		
		Чтобы отобразить список значений (например ' IN(5,6,10) ' - в аргументы передается массив ( array(5,6,10) ). Массив, преобразуется в список подготовленных значений, разделенных запятой, таким образом вырзажение IN(?) превратиться в IN(5,6,10).
		
		Чтобы реализовать LIKE-поиск подстроки , нужно передать строку обрамленную % с обоих или одной стороны. Например, чтобы получить ' LIKE "%$text%" ' нужно в $sql написать ' LIKE ? ' , а в аргуент передать "%$text%"

		
	Db::get_row($sql, $arg1, $arg2, ...) - извлекает одну строку, - объект со своствами строки
	
	Db::get_var($sql, $arg1, $arg2, ...) - извлекает одно значение 
	Db::get_col($sql, $arg1, $arg2, ...) - извлекает колонку - индексный массив значнией из одной колонки
	Db::query($sql, $arg1, $arg2, ...) - выполняет SQL запрос
	
	
	Db::field_exists($table, $field, $field_prefix='') - возвращает TRUE, если в таблице $table существует поле (колонка) с именем $field либо $field_prefix.$field
	
	Db::col_exists() - синоним Db::field_exists
	
	Db::get_fields($table) - возвращает массив с именами всех колонок в указанной таблице
	
	Db::save_row($table, $data) - записывает строку в таблицу; $data - ассоциативный массив, где ключи - имена обновляемых колонок-полей. Если в $data указан id (элемент с ключем 'id') - то происходит обновление (UPDATE) существующей строки, иначе (если id не указан), - делает вставка новой строки (INSERT). Возразает ID одновленной или новой строки. 
	
	Db::make_unique($table, $col, $value) - создает (вычисляет, находит) уникальное значние из строки $value, при необходимости добавляя цифровой префикс, елси такое значение уже есть в колонке.
	
	Db::quote($value) - закавычивает и экранирует значение
	Db::escape($value) - экранирует значение для вставки в SQL, экранируя опасные символы
	
	
	ЕЩЁ НЕ РЕАЛИЗОВАНО:
	~~~~~~~~~~~~~~~~~~
	Db::col_create($table, $col_name, $col_definition='TEXT') - создает колонку, если она не существует. 
	 
	Db::col_rename($table, $col_name1, $col_name2) - переименовывает колонку (ЕЩЁ НЕ РЕАЛИЗОВАНО) 
	
	
	
	
	
*/

// pr(cfg());
// pr(DB_PATH);

// инициализируем интерфейс базы данных
Db::init(array(
	'EZSQL_PATH'=> LIB_DIR.'/ezsql',
	'DB_ENGINE'	=> DB_ENGINE, //= 'sqlite'
	'DB_PREFIX' => DB_PREFIX,
	
	// for sqlite:
	'DB_PATH'	=> DB_PATH, 
	'DB_FILE'	=> DB_FILE, 
	
	// for mysql:
	'DB_USER'=>DB_USER, 'DB_PASSWORD'=>DB_PASSWORD, 'DB_NAME'=>DB_NAME,'DB_HOST'=>DB_HOST, 

));

// test: pr(Db::get_col('SELECT title FROM #site_pages'));

class Db {
    
	
	static $DB; // объект базы данных
	static $opt=array(); // опции инициализации
    
	// инициализирует класс и подключается к базе данных
	static function init($opt)
	{
		
		$old_opt = self::$opt; // сохраняем старые настройки
		self::$opt=(object)array_merge( (array)self::$opt, $opt) ; // прибавляем новые настройки к старым
		$opt =& self::$opt; // создаем короткую ссылку на текущие настройки
		
		include_once $opt->EZSQL_PATH.'/shared/ez_sql_core.php';
		
		
		$DB =& self::$DB ;
		
		if($opt->DB_ENGINE=='sqlite')
		{
			include_once $opt->EZSQL_PATH.'/sqlite/ez_sql_sqlite.php';
			
			 // pr($opt->DB_PATH.'/'.$opt->DB_FILE);
			
			$opt->DB_PATH = rtrim($opt->DB_PATH) .'/';
			
			if (!file_exists($opt->DB_PATH))
				mkdir($opt->DB_PATH, 0666);
				
			if(! File::is_writable_dir($opt->DB_PATH))
				trigger_error('DB_PATH "'.$opt->DB_PATH.'" is not exists or is not writeble dir!  ' , E_USER_ERROR  );
			if (file_exists($db = $opt->DB_PATH . $opt->DB_FILE) 
				&& !is_writable($db))
				trigger_error('Database "'.$opt->DB_FILE.'" is not writeble file!  ' , E_USER_ERROR  );
			
			
			$DB = new ezSQL_sqlite($opt->DB_PATH, $opt->DB_FILE);
			$DB->query('PRAGMA encoding = "UTF-8"'); // Кодировка БД указывается сразу после ее создания. Потом PRAGMA encoding просто игнорируется.
			/* 	другие настройки SQlite для ускорения:
				PRAGMA cache_size = 2000;
				PRAGMA default_cache_size = 2000;
				PRAGMA encoding = UTF-8;
				PRAGMA page_size = 1024;
				PRAGMA synchronous = off;
				PRAGMA count_changes = off;
				PRAGMA temp_store = MEMORY;
			*/
			
			//pr($opt->DB_PATH. $opt->DB_FILE);
			
		}
		
		
		if($opt->DB_ENGINE=='mysql')
		{
			include_once $opt->EZSQL_PATH.'/mysql/ez_sql_mysql.php';
			$DB = new ezSQL_mysql($opt->DB_USER, $opt->DB_PASSWORD, $opt->DB_NAME, $opt->DB_HOST);
			$DB->query("SET NAMES utf8");
			
			
		}
		
		$DB->show_errors();
		
		return $old_opt;
	}
    
	
	// извлекает выборку-таблицу
	static function get_results()
    {
        $args = func_get_args();
        return self::exec(__FUNCTION__, $args); 
    }
    
	// извлекает строку
    static function get_row()
    {
        $args = func_get_args();
        return self::exec(__FUNCTION__, $args);
	}
    
	// извлекает значение
    static function get_var()
    {
        $args = func_get_args();
        return self::exec(__FUNCTION__, $args);
    }
    
	static function get_col()
    {
        $args = func_get_args();
        return self::exec(__FUNCTION__, $args);
    }
	
	// выполняет SQL запрос
	static function query()
    {
        $args = func_get_args();
        return self::exec(__FUNCTION__, $args);
    }
	
	
	// вызывает запрошенный метод в объекте ezSQL, предварительно подгатавливая аргументы и подставляя их в SQL-шаблон
    static function exec($func, $args)
    {
        // pr($func, $args);
		
		// обрабатываем sql-шаблон - подставляем аргументы  
		$sql = array_shift($args);
		// pr($sql);
		
		$sql = self::qw_wrap($sql, $args);
		// pr($sql);
		
		// вызываем запрошенный метод в объекте ezSQL 
		//$result = call_user_func_array(array(self::$DB, $func ), $sql);
        $result = self::$DB->$func($sql);
		
		if ($err = self::$DB->last_error) 
        {
            trigger_error( 'Ошибка при обращении к базе данных:  '.$err,E_USER_ERROR);
			//self::$DB->debug(); exit;
        }    
        return $result;
    }
		
	
	
/* 	qw_wrap($sql_tpl, $args)  -  обрабатывает символы подстанвоки в SQL шаблоне, заменяя их на соответствующие занчения из массива $args,   подгатавливая(экранируя) их, чтобы защититься от SQL инъекций
	 
	Преобразует sql-шаблон вида:  
	"SELECT * FROM `#something` WHERE `id` IN (?) AND `something_other` = ?"
	к нормальному виду, заменяя  "#" на префикс таблиц, "?" - на обработанное-экранированное значение или список значений, разделенных запятыми (если значение - массив). 
	  
	Возвращает строку - готовое к исполнению SQL-выражение.
*/
	
	static function qw_wrap($tpl, $args=array())
	{
		// pr($tpl, $args);
		
		$tpl = str_replace('#', self::$opt->DB_PREFIX, $tpl);
		if (!$args) return $tpl;
		// pr($tpl);
		
		
		$tpl = str_replace(array('%','?'), array('%%', '%s'), $tpl);
		//pr($tpl);
		
		if (substr_count($tpl, '%s') != sizeof($args)) 
		{
			trigger_error('Db::qw_wrap: Количество подставляемых аргументов не соответствует количеству подстановочных символов "?" в SQL-шаблоне '.$tpl , E_USER_ERROR );
		}
		
		foreach($args as &$value)
			$value = self::quote($value);
		//pr($args);
		
		
		$sql = call_user_func_array('sprintf', array_merge(array($tpl), $args));
		// pr($sql);
		
		return $sql;
	}
	
	/*	Db::quote($value)
		- если аргумент - скаляр и строка - закавычивает, 
		- если аргумент - массив, то аналогично обрабытывает каждый элемент массива и преобразует в строку - список элементов, разделенных запятыми, -  для использования в конструкции  IN(value1, value2, value3) 
	*/
	static function quote($value)
	{
		if(is_array($value))
		{
			$t = array();
			foreach($value as $val)
			{
				if (is_int($val) || is_float($val)) 
					$t[] = $val;
				else
					$t[] = "'".self::escape($val)."'";
			}
			$value = implode(',', $t);
		}else
		{
			if( !is_int($value) && !is_float($value)) 
					$value = "'".self::escape($value)."'";
		}
		
		return $value;
	}
	static function escape($value)
	{
		return self::$DB->escape($value);
	}
	
	
	

	// кеш массив для хранения столбцов таблиц
	static $fields = array();
	
	// get_fields($table) - возвращает массив с именами всех столбцов в таблице
	static function get_fields($table)
    {
		if (empty(self::$fields[$table]))
		{		
			// :TODO: сделать защитную фильтрацию символов в параметре $table
			Db::get_row("SELECT * FROM $table LIMIT 1");
			self::$fields[$table] = Db::$DB->get_col_info('name');
		}
		return self::$fields[$table];
        
    }
	
	// Db::field_exists($table, $field, $field_prefix='') - проверяет, существует ли в таблице поле с указанным именем и возможным префиксом
	// возвращает корректное имя поля (исходное имя или с префиксом - как оно в базе существует) или false
	static function field_exists($table, $field, $field_prefix='')
    {
		$table_fields = self::get_fields($table);
		
		if (in_array($field, $table_fields) 
				OR ($field_prefix &&
					in_array( $field = $field_prefix.$field, $table_fields ))
			)
			return $field; 
		else
			return false;
    }
	
	// создает колонку, если она не существует 
	static function col_create($table, $col_name, $col_definition='TEXT')
	{
		// pr(self::get_fields($table));
		//pr(self::get_fields($table));
		if (!self::col_exists($table, $col_name))
			Db::query("ALTER TABLE $table ADD COLUMN $col_name $col_definition");
	}
	
	
	// переименовывает колонку 
	static function col_rename($table, $col_name1, $col_name2)
	{
	
	}
	
	static function col_exists()
	{
		$args = func_get_args();
		return call_user_func_array(array(__CLASS__, 'field_exists'), $args);
	}
	
	/***
		Db::make_unique($table, $col, $value)
		создает уникальное значние из $value
		
		@params	
			$table 	- имя таблицы базы данных
			$col	- имя поля (колонки)
			$value	- значение, которое должны быть уникальным
			$id		- id игнорируемой строки (для которой и готовиться это уникальное значение, и которую поэтому нужно не учитывать)
			
		Если в указанной таблице и колонке уже присутствует указанное значение, то прибавляет цифровой префикс '_2' , '_3' , '_4' и т.д. пока не будет найдено уникальное значение 
		Возращает исходное значение или измененное - с добавленным цифровым суффиксом.
	
	***/			
	static function make_unique($table, $col, $value, $ignore_id=null)
	{
		if (!self::col_exists($table, $col)) return false;
		
		$base_value=$value;
		$i=1; 
		while(  $i<=1000 AND
				$same_value = Db::get_var(
					"SELECT $col FROM $table 
					 WHERE $col=? AND id<>?" ,
					 $value,  intval($ignore_id)
					 )
			)
			{
				$value = $base_value .'_'. ++$i;
			}
		return $value;	
	}
	
	
	static 
	function save_row($table, $data)
	{
		$data = (array)$data;
		$table = str_replace('#' , DB_PREFIX, $table);
		$fields =  self::get_fields($table);
		// pr($data);
		
		if (!empty($data['id'])) // если указан id, то это обновление строки
		{
			$str_fields = '';
			foreach ($fields as $field)
				if (isset($data[$field]))
					$str_fields .= " $field=" 
						. self::quote($data[$field]) .',';
			
			$str_fields = rtrim($str_fields, ',') ."\n";
			
			$query ="
					UPDATE $table 
					SET  $str_fields
					WHERE id=" . intval($data['id'])
					;
			// pr($query);
			
			self::$DB->query($query);
			return intval($data['id']);
			
		}
		else // если не указан id, то это вставка новой строки
		{
			
			$str_fields = $str_values = "";
			foreach ($fields as $field)
				if (isset($data[$field]))
				{	
					$str_fields .= "$field,";
					$str_values .= self::quote($data[$field]) .',';
				}
			$str_fields = rtrim($str_fields, ',') ;
			$str_values = rtrim($str_values, ',') ;			
			
			$query = "
			INSERT INTO $table ($str_fields)
			VALUES ($str_values)
			";
			
			//pr($query);
			self::$DB->query($query);
			
			// возвращаем id новой строки
			return self::insert_id();
			
		}
		
	}
	
	// возвращает id последней вставленной строки
	static function insert_id()
	{
		if (DB_ENGINE=='sqlite')
			return sqlite_last_insert_rowid(self::$DB->dbh);
		if (DB_ENGINE=='mysql')
			return mysql_insert_id(self::$DB->dbh);		
	}
	
	static function debug()
	{
		self::$DB->debug();
	}
	
	
	
	

	
	
	
	
	
}







/*
Реализация ALTER TABLE для SQLite

Синтаксис:
	ALTER TABLE tbl_name alter_specification [, alter_specification] ...

	alter_specification:
		ADD column_definition
	  | DROP column_definition
	  | CHANGE old_col_name column_definition

	column_definition:
		same as for create table statements
		
	
Примеры:
	ALTER TABLE employees ADD first_name VARCHAR(50), ADD last_name VARCHAR(50)
	ALTER TABLE invoices ADD note text, CHANGE idate invoice_date DATETIME
	ALTER TABLE foo DROP bar, ADD bar2 INTEGER


Интерпретатор ALTER TABLE из другого класса	

function query($sql){
      $this->error = '';
      if(strtolower(substr(ltrim($sql),0,5))=='alter'){
        $queryparts = preg_split("/[\s]+/",$sql,4,PREG_SPLIT_NO_EMPTY);
        $tablename = $queryparts[2];
        $alterdefs = $queryparts[3];
        if(strtolower($queryparts[1]) != 'table' || $queryparts[2] == '')
          $this->error = 'near "'.$queryparts[0] . '": syntax error';
        else{
          set_error_handler(array(&$this, 'catcherror'));
          $result = $this->altertable($tablename,$alterdefs);
          restore_error_handler();
        }
      }
      else{
        set_error_handler(array(&$this, 'catcherror'));
        $result = sqlite_query($this->handle,$sql);
        restore_error_handler();
        if($this->error){
          return null;
        }
      }
      return $result;
    }
    
	function altertable($table,$alterdefs){
      if($alterdefs != ''){
        $result = sqlite_query($this->handle,"SELECT sql,name,type FROM sqlite_master WHERE tbl_name = '".$table."' ORDER BY type DESC");
        if(sqlite_num_rows($result)>0){
          $row = sqlite_fetch_array($result); //table sql
          $tmpname = 't'.time();
          $origsql = trim(preg_replace("/[\s]+/"," ",str_replace(",",", ",preg_replace("/[\(]/","( ",$row['sql'],1))));
          $createtemptableSQL = 'CREATE TEMPORARY '.substr(trim(preg_replace("'".$table."'",$tmpname,$origsql,1)),6);
          $createindexsql = array();
          $i = 0;
          $defs = preg_split("/[,]+/",$alterdefs,-1,PREG_SPLIT_NO_EMPTY);
          $prevword = $table;
          $oldcols = preg_split("/[,]+/",substr(trim($createtemptableSQL),strpos(trim($createtemptableSQL),'(')+1),-1,PREG_SPLIT_NO_EMPTY);
          $newcols = array();
          for($i=0;$i<sizeof($oldcols);$i++){
            $colparts = preg_split("/[\s]+/",$oldcols[$i],-1,PREG_SPLIT_NO_EMPTY);
            $oldcols[$i] = $colparts[0];
            $newcols[$colparts[0]] = $colparts[0];
          }
          $newcolumns = '';
          $oldcolumns = '';
          reset($newcols);
          while(list($key,$val) = each($newcols)){
            $newcolumns .= ($newcolumns?', ':'').$val;
            $oldcolumns .= ($oldcolumns?', ':'').$key;
          }
          $copytotempsql = 'INSERT INTO '.$tmpname.'('.$newcolumns.') SELECT '.$oldcolumns.' FROM '.$table;
          $dropoldsql = 'DROP TABLE '.$table;
          $createtesttableSQL = $createtemptableSQL;
          foreach($defs as $def){
            $defparts = preg_split("/[\s]+/",$def,-1,PREG_SPLIT_NO_EMPTY);
            $action = strtolower($defparts[0]);
            switch($action){
            case 'add':
              if(sizeof($defparts) <= 2){
                trigger_error('near "'.$defparts[0].($defparts[1]?' '.$defparts[1]:'').'": syntax error',E_USER_WARNING);
                return false;
              }
              $createtesttableSQL = substr($createtesttableSQL,0,strlen($createtesttableSQL)-1).',';
              for($i=1;$i<sizeof($defparts);$i++)
                $createtesttableSQL.=' '.$defparts[$i];
              $createtesttableSQL.=')';
              break;
            case 'change':
              if(sizeof($defparts) <= 3){
                trigger_error('near "'.$defparts[0].($defparts[1]?' '.$defparts[1]:'').($defparts[2]?' '.$defparts[2]:'').'": syntax error',E_USER_WARNING);
                return false;
              }
              if($severpos = strpos($createtesttableSQL,' '.$defparts[1].' ')){
                if($newcols[$defparts[1]] != $defparts[1]){
                  trigger_error('unknown column "'.$defparts[1].'" in "'.$table.'"',E_USER_WARNING);
                  return false;
                }
                $newcols[$defparts[1]] = $defparts[2];
                $nextcommapos = strpos($createtesttableSQL,',',$severpos);
                $insertval = '';
                for($i=2;$i<sizeof($defparts);$i++)
                  $insertval.=' '.$defparts[$i];
                if($nextcommapos)
                  $createtesttableSQL = substr($createtesttableSQL,0,$severpos).$insertval.substr($createtesttableSQL,$nextcommapos);
                else
                  $createtesttableSQL = substr($createtesttableSQL,0,$severpos-(strpos($createtesttableSQL,',')?0:1)).$insertval.')';
              }
              else{
                trigger_error('unknown column "'.$defparts[1].'" in "'.$table.'"',E_USER_WARNING);
                return false;
              }
              break;
            case 'drop':
              if(sizeof($defparts) < 2){
                trigger_error('near "'.$defparts[0].($defparts[1]?' '.$defparts[1]:'').'": syntax error',E_USER_WARNING);
                return false;
              }
              if($severpos = strpos($createtesttableSQL,' '.$defparts[1].' ')){
                $nextcommapos = strpos($createtesttableSQL,',',$severpos);
                if($nextcommapos)
                  $createtesttableSQL = substr($createtesttableSQL,0,$severpos).substr($createtesttableSQL,$nextcommapos + 1);
                else
                  $createtesttableSQL = substr($createtesttableSQL,0,$severpos-(strpos($createtesttableSQL,',')?0:1) - 1).')';
                unset($newcols[$defparts[1]]);
              }
              else{
                trigger_error('unknown column "'.$defparts[1].'" in "'.$table.'"',E_USER_WARNING);
                return false;
              }
              break;
            default:
              trigger_error('near "'.$prevword.'": syntax error',E_USER_WARNING);
              return false;
            }
            $prevword = $defparts[sizeof($defparts)-1];
          }
          
          
          //this block of code generates a test table simply to verify that the columns specifed are valid in an sql statement
          //this ensures that no reserved words are used as columns, for example
          sqlite_query($this->handle,$createtesttableSQL);
          if($this->error){
            return false;
          }
          $droptempsql = 'DROP TABLE '.$tmpname;
          sqlite_query($this->handle,$droptempsql);
          //end block
          
          
          $createnewtableSQL = 'CREATE '.substr(trim(preg_replace("'".$tmpname."'",$table,$createtesttableSQL,1)),17);
          $newcolumns = '';
          $oldcolumns = '';
          reset($newcols);
          while(list($key,$val) = each($newcols)){
            $newcolumns .= ($newcolumns?', ':'').$val;
            $oldcolumns .= ($oldcolumns?', ':'').$key;
          }
          $copytonewsql = 'INSERT INTO '.$table.'('.$newcolumns.') SELECT '.$oldcolumns.' FROM '.$tmpname;
          
          
          sqlite_query($this->handle,$createtemptableSQL); //create temp table
          sqlite_query($this->handle,$copytotempsql); //copy to table
          sqlite_query($this->handle,$dropoldsql); //drop old table
          
          sqlite_query($this->handle,$createnewtableSQL); //recreate original table
          sqlite_query($this->handle,$copytonewsql); //copy back to original table
          sqlite_query($this->handle,$droptempsql); //drop temp table
        }
        else{
          trigger_error('no such table: '.$table,E_USER_WARNING);
          return false;
        }
        return true;
      }
    }
	

*/




/*
try
{
	switch(DB_ENGINE)
	{
		case 'sqlite':
			
			//$DB->show_errors();
			
			//$DB->qw('DROP TABLE #pages; DROP TABLE #blog_posts; DROP TABLE #blog_categories;'); // for easy debugging :)
			
			if(0 && FIRST_TIME)
			{
				$DB->qw('CREATE TABLE #pages
				(
					id INTEGER PRIMARY KEY ASC, 
					parent_id INTEGER,
				
					title TEXT,
					urlword TEXT,
				
					priority INTEGER,
					visible INTEGER,
				
					show_in_menu TEXT,
					content TEXT,
					modules TEXT,
					page_title TEXT,
					page_description TEXT
				)');
				
				$DB->qw('CREATE INDEX pages_parent_id ON #pages(parent_id)');
				
				$DB->qw('CREATE TABLE #blog_posts
				(
					id INTEGER PRIMARY KEY ASC,
					category_id INTEGER,

					title TEXT,
					urlword TEXT,
				
					visible INTEGER,
					created_date INTEGER, -- UNIX TIMESTAMP
					content TEXT,

					announce TEXT,
					img TEXT,
					images TEXT, -- images, embedded to post, in serialized array
					
					addcode TEXT
				)');
				
				$DB->qw('CREATE INDEX blog_posts_category_id ON #blog_posts(category_id)');
				$DB->qw('CREATE INDEX blog_posts_created_date ON #blog_posts(created_date)');

				$DB->qw('CREATE TABLE #blog_categories 
				(
					id INTEGER PRIMARY KEY ASC,
					title TEXT
				)');
			}

			break;
		case 'mysql':
			
			throw new Exception('MySQL create table not implemented yet');
			
			break;
	}
}catch(Exception $e)
{
	// ignore if tables already exist
	
	die('Exception: '.$e->getMessage());
}
*/

/*
Менеджеры SQLite
http://www.sqlite.org/cvstrac/wiki?p=ManagementTools
*/
/*
Как выполнить добавление или удаление полей в существующую таблицу SQLite?

SQLite имеет ограниченную поддержку ALTER TABLE, позволяющую добавлять столбцы в конец таблицы и менять имена полей и таблиц. Если вам требуется провести более сложные изменения структуры таблицы, нужно пересоздать ее. Вы можете сохранить существующие данные во временной таблице, удалить старую таблицы, создать новую, скопировать данные обратно из временной таблицы.

Например, вы имеете таблицу "t1" с полями "a", "b", и "c", нужно удалить поле "c" из этой таблицы. Следующие шаги показывают, как это можно выполнить:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


*/


/* $sql="
BEGIN TRANSACTION;
	ALTER TABLE aurim_pages RENAME TO site_pages ;
	ALTER TABLE aurim_blog_posts RENAME TO blog_posts ;
	ALTER TABLE aurim_blog_categories RENAME TO blog_categories ;
COMMIT;	
";*/
//Db::$DB->query('ALTER TABLE aurim_pages RENAME TO site_pages'); 


// Показать все таблицы из базы MySQL
//pr(Db::query("SHOW TABLES"));

//Показать все таблицы из базы SQLite //tbl_name
//pr(Db::$DB->get_results("SELECT * FROM sqlite_master WHERE 1 or type='table'")); 
//pr(Db::$DB->get_results("SELECT * FROM sqlite_master WHERE 1 or type='table'")); 


/* Преобразование данных (норммализация поля modules) 
$sql = "UPDATE site_pages SET modules = '' WHERE modules NOT LIKE '%category%' ";
//Db::query($sql);
$sql = "SELECT id,title,modules FROM #site_pages WHERE modules LIKE '%category%' LIMIT 1000";
$res = Db::get_results($sql); 

foreach ($res as &$row)
{
	$m = unserialize($row->modules);
	$row->modules = array('blog'=>$m['blog']);
	$row->modules = serialize($row->modules);
	Db::save_row('#site_pages',$row);
}	


$sql = "SELECT id,title,modules ,widgets FROM #site_pages WHERE 1 LIMIT 1000";
$res = Db::get_results($sql); 
pr($res); 
*/
?>